時間限制: 1000 ms 內存 u限制: 65536 KB
提交數: 14176 通過數: 6917
【題目描述】
高精除以高精,求它們的商和余數。
【輸入】
輸入兩個低于300位的正整數。
【輸出】
輸出商和余數。
【輸入樣例】
1231312318457577687897987642324567864324567876543245671425346756786867867867
1231312318767141738178325678412414124141425346756786867867867
【輸出樣例】
999999999748590
179780909068307566598992807564736854549985603543237528310337
#include<iostream>
using namespace std;
string s1, s2;
int a[301], b[301], c[301], tmp[301];
int la, lb, lc, lt;//定義長度在外面
void reverseStrtoInt(string src, int* des) {
? ? for (int i = 0; i < src.size(); i++) {
? ? ? ? des[src.size() - i] = src[i] - '0';
? ? }
}
int move(int B[], int TMP[], int LB, int I) {
? ? for (int i = 1; i <= LB; i++) {
? ? ? ? TMP[i + I] = B[i];
? ? }
? ? return LB + I;
}
int mycmp(int A[], int TMP[], int LA, int LT) {
? ? if (LA > LT) {
? ? ? ? return 1;
? ? }
? ? else if (LA < LT) {//if
? ? ? ? return -1;
? ? }
? ? else {//無else
? ? ? ? for (int i = LA; i >= 1; i--) {
? ? ? ? ? ? if (A[i] > TMP[i]) {
? ? ? ? ? ? ? ? return 1;
? ? ? ? ? ? }
? ? ? ? ? ? if (A[i] < TMP[i]) {
? ? ? ? ? ? ? ? return -1;
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? return 0;
}
void sub(int A[], int TMP[], int& LA,int LT) {//記得傳引用
? ? for (int i = 1; i <= LT; i++) {
? ? ? ? if (A[i] < TMP[i]) {
? ? ? ? ? ? A[i + 1]--;
? ? ? ? ? ? A[i] += 10;
? ? ? ? }
? ? ? ? A[i] = A[i] - TMP[i];
? ? }
? ? while (A[LA] == 0 && LA > 1) LA--;
}
int main() {
? ? cin >> s1 >> s2;
? ? if (s2[0] == '0') {
? ? ? ? return 0;
? ? }
? ? la = s1.size(),lb=s2.size();
? ? lc = la - lb + 1;
? ? reverseStrtoInt(s1, a);
? ? reverseStrtoInt(s2, b);
? ? for (int i = lc; i >= 1; i--) {
? ? ? ? lt = move(b, tmp, lb, i - 1);//位移除數
? ? ? ? while (mycmp(a, tmp, la, lt) >= 0) {//比較a和tmp數組誰大,這樣才能減
? ? ? ? ? ? c[i]++;
? ? ? ? ? ? sub(a, tmp, la, lt);//如果可以減就調用減法
? ? ? ? }
? ? ? ? //la--;錯
? ? }
? ? while (c[lc] == 0 && lc > 1) lc--;
? ? for (int i = lc; i >= 1; i--) {
? ? ? ? cout << c[i];
? ? }
? ? cout << endl;
? ? for (int i = la; i >= 1; i--) {
? ? ? ? cout << a[i];//余下來就是減完之后的余數
? ? }
? ? return 0;
}